/**
 * @Copyright ®2015 Sinosoft Co. Ltd. All rights reserved.<br/>
 * 项目名称 : 电子商务云服务平台
 * 创建日期 : 2016年6月28日
 * 修改历史 : 
 *     1. [2016年7月14日]修改文件 by lijialun
 * 添加Javadoc注释，更新代码规范，静态工具类增加private构造函数
 */
package com.gavinwind.inspay.common.advice;

import com.gavinwind.inspay.common.logger.PlatformLogger;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;
import java.util.List;

/**
  *【大对象监控拦截器】
  * 对批量新增、删除进行监控，如果超过指定数量则记录日志
  * @author WangL
  * @date  Dept 24, 2015 
  * @version 1.0
  *【修改描述】
  *
  */
public class BigObjectAdvice implements MethodBeforeAdvice, AfterReturningAdvice {

    protected final PlatformLogger logger = PlatformLogger.getLogger(this.getClass());
    /**
     * 最大数量
     */
    private int maxSize;

    /**
     * 
    * 方法执行之后被调用
    * 
    * @param cReturnObj
    *       返回对象
    * @param cMethod
    *       拦截方法
    * @param cPram
    *       拦截方法参数
    * @param cTarget
    *       目标代理对象
    * @throws Throwable
    *       异常
     */
    @SuppressWarnings("rawtypes")
    public void afterReturning(Object cReturnObj, Method cMethod, Object[] cPram, Object cTarget) throws Throwable {
        if (cReturnObj instanceof List) {
            List tRsList = (List) cReturnObj;
            if (tRsList.size() > maxSize) {
                logger.warn("返回超过允许最大长度,返回结果集长度为" + tRsList.size());
            }
        }
    }

    /**
     * 
    * 方法执行之前被调用
    * 
    * @param cMethod
    *       拦截方法
    * @param cPramObj
    *       方法参数
    * @param cTarget
    *       目标代理对象
    * @throws Throwable
    *       异常
     */
    @SuppressWarnings("rawtypes")
    public void before(Method cMethod, Object[] cPramObj, Object cTarget) throws Throwable {
        if (cPramObj.length > 2) {
            Object tSecObj = cPramObj[1];
            if (tSecObj instanceof List) {
                List tRsList = (List) tSecObj;
                if (tRsList.size() > maxSize) {
                    logger.warn("返回超过允许最大长度,返回结果集长度为" + tRsList.size());
                }
            }
        }
    }

    /**
     * @return the maxSize
     */
    public int getMaxSize() {
        return maxSize;
    }

    /** 
     * 方法功能描述
     * @param cMaxSize
    */ 
    public void setMaxSize(int cMaxSize) {
        this.maxSize = cMaxSize;
    }

}
